import axios from 'axios'
import router from '@/router/index'
import { ElMessage, ElMessageBox } from 'element-plus'
import { clearCookie } from './cookie'
import type { ApiResponse } from '@/api/base'

//创建axios实例
const request = axios.create({
  // 配置请求前缀的基础路径
  baseURL: import.meta.env.VITE_APP_BASE_API, //基础路径前缀 ，根据环境变量来获取，方便切换 /dev-api
  timeout: 10000 //请求超时时间
})
//请求拦截器
request.interceptors.request.use((config) => {
  return config
})
//响应拦截器
request.interceptors.response.use(
  // 成功回调
  (response) => {
    const res: ApiResponse = response.data
    // 如果返回的是业务状态码code==2000,则为成功
    if (res.code !== 2000) {
      ElMessage({
        message: res.msg || 'Error',
        type: 'error',
        duration: 5 * 1000
      })
      // 返回一个Promise.reject对象，业务返回的异常,会自动返回我们后台返回的错误信息，前端不需要自己写
      return Promise.reject(new Error(res.msg || 'Error'))
    } else {
      // code===2000 代表成功，这里先去掉一层皮
      return res.data
    }
  },
  //失败回调
  async (error) => {
    if (error.response) {
      // 请求已发出，但服务器响应的状态码不在 2xx 范围内
      if (error.response.status === 401) {
        await ElMessageBox.confirm('身份已失效,请重新登录', '提示信息', {
          confirmButtonText: '确定',
          type: 'error'
        }).then(() => {
          //清空cookies信息
          const cookiesToClear = ['X-Token'] /* 添加其他需要清除的cookie名称 */
          cookiesToClear.forEach((cookieName) => clearCookie(cookieName))
          router.push('/login')
        })
      } else if (error.response.status === 403) {
        //权限不足
        ElMessage({
          message: '权限不足',
          type: 'error',
          duration: 5 * 1000
        })
      } else {
        // 其他错误
        ElMessage({
          message: '服务器系统异常',
          type: 'error',
          duration: 5 * 1000
        })
      }
    } else {
      if (error.response) {
        // 处理请求未发出或者网络错误等情况
        ElMessage({
          message: '无法连接到服务器，请检查您的网络连接',
          type: 'error',
          duration: 5 * 1000
        })
      }
    }
    return Promise.reject(error)
  }
)
export default request
